package pl.un4giv3n.mightvsmagic.action;

import javax.mail.NoSuchProviderException;
import javax.persistence.EntityManager;

import pl.un4giv3n.mightvsmagic.entity.User;
import pl.un4giv3n.mightvsmagic.entity.UserType;
import pl.un4giv3n.mightvsmagic.utils.MailSender;
import pl.un4giv3n.mightvsmagic.utils.UserUtil;

/**
 * @author andrzejewskia 
 * register an user to the game
 */
public class RegisterAction extends PersistenceAction {

	private static final long serialVersionUID = 1L;

	/**
	 * username to register
	 */
	private String username;
	/**
	 * user passwd
	 */
	private String password;
	/**
	 * retyped passwd to check misspelling
	 */
	private String retypedPassword;
	/**
	 * user mail for future enchancements
	 */
	private String email;

	private boolean acceptRegulations;
	
	private UserType userType;

	/*
	 * (non-Javadoc)
	 * 
	 * @see pl.un4giv3n.mightvsmagic.action.PersistenceAction#execute()
	 */
	public String execute() {
		username = username.trim();
		password = password.trim();
		EntityManager entityManager = getEntityManager();
		if (validateData(entityManager)) {
			entityManager.getTransaction().begin();
			password = UserUtil.encyptPassword(password);
			User user = new User(username, password, email, userType);
			entityManager.persist(user);
			entityManager.flush();
			entityManager.getTransaction().commit();
			getSession().put(USER_ID, user.getId());
			entityManager.close();
			try {
				MailSender.send(user.getEmail(), MailSender.NEW_USER_SUBJECT, MailSender.getNewUserMessage(username, user.getId()+""));
			} catch (NoSuchProviderException e) {
				LOG.error(e.getMessage(),e);
				addActionError("Błąd wysyłania wiadomości e-mail dotyczącej rejestracji!");
				return INPUT;
			}
			return SUCCESS;
		} else {
			entityManager.close();
			return INPUT;
		}
	}

	/**
	 * @param entityManager 
	 * @return true if user can be registered
	 */
	private boolean validateData(EntityManager entityManager) {
		boolean valid = true;
		if(!acceptRegulations){
			addActionError("Akceptacja regulaminu jest wymagana");
			valid = false;
		}
		if (!UserUtil.validateEmail(email)) {
			valid = false;
			addActionError("Niepoprawny format adresu email");
		}
		if (!UserUtil.validatePassword(password)) {
			valid = false;
			addActionError("Hasło musi zawierać conajmniej 6 znaków, w tym conajmniej jedną dużą i małą literę oraz cyfrę. Dozwolone są znaki alfanumeryczne i _");
		} else if (!password.equals(retypedPassword)) {
			valid = false;
			addActionError("Hasła nie zgadzają się");
		}
		if (!UserUtil.validateLogin(username)) {
			valid = false;
			addActionError("Niepoprawny login. Dozwolne są znaki alfanumeryczne i _");
		} 
		if (!UserUtil.isLoginFree(username, entityManager)) {
			valid = false;
			addActionError("Ten login jest już zajęty");
		}
		if(!UserUtil.isEmailFree(email, entityManager)){
			valid = false;
			addActionError("Na ten adres zarejestrowane jest już konto");
		}
		if ("admin".equals(username)) {
			valid = false;
			addActionError("Ten login jest zabroniony");
		}
		return valid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getRetypedPassword() {
		return retypedPassword;
	}

	public void setRetypedPassword(String retypedPassword) {
		this.retypedPassword = retypedPassword;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public UserType getUserType() {
		return userType;
	}

	public void setUserType(UserType userType) {
		this.userType = userType;
	}

	public boolean isAcceptRegulations() {
		return acceptRegulations;
	}

	public void setAcceptRegulations(boolean acceptRegulations) {
		this.acceptRegulations = acceptRegulations;
	}

}
